import Interceptor from "./core/interceptor";
import Request from "./index";
import qs from 'qs'
import {removeUserId,removeUserInfo,removeAccessToken,getJumpLoginFlag,removeBaseUser,setJumpLoginFlag,getSupid} from '@/util/cache.js'
import {serviceUrl} from '@/config/index.js'
import {getAccessToken} from '@/util/cache.js'

export const globalInterceptor = {
  request: new Interceptor(),
  response: new Interceptor()
};

/**
 * 全局配置
 * 只能配置 静态数据
 * `content-type` 默认为 application/json
 * `header` 中`content-type`设置特殊参数 或 配置其他会导致触发 跨域 问题，出现跨域会直接进入响应拦截器的catch函数中
 */
export const config = {
  baseURL: serviceUrl,
  header: {
    // 'X-Auth-Token': 'xxxx',
    'Content-Type': 'application/json',
  },
  timeout: 30000 // 请求超时时间
};

/**
 * 全局 请求拦截器, 支持添加多个拦截器
 * 例如: 配置token、添加一些默认的参数
 *
 * `return config` 继续发送请求
 * `return false` 会停止发送请求，不会进入错误数据拦截，也不会进入请求对象中的catch函数中
 * `return Promise.reject('xxxxx')` 停止发送请求, 会错误数据拦截，也会进入catch函数中
 *
 * @param {Object} config 发送请求的配置数据
 */
globalInterceptor.request.use(
  config => {
	  
	// token
	let token = getAccessToken()
	if(!config.params) {
		config.params = {}
	}
	if(!config.data) {
		config.data = {}
	}
	if(token && token.token) {
		if(config.method == 'get' || config.method == 'GET') {
			config.params['token'] = token.token
		} else {
			config.data['token'] = token.token
		}
	}
	
	// 商户ID
	let supid = getSupid()
	if(supid) {
		if(config.method == 'get' || config.method == 'GET') {
			config.params['supid'] = supid
		} else {
			config.data['supid'] = supid
		}
	}
	
	config.paramsSerializer = function (p) {
		return qs.stringify(p, { arrayFormat: 'repeat' })
	}
	
	console.log(config)
    return config;
  },
  err => {
    console.error("is global fail request interceptor: ", err);
    return false;
  }
);

/**
 * 全局 响应拦截器, 支持添加多个拦截器
 * 例如: 根据状态码选择性拦截、过滤转换数据
 *
 * `return res` 继续返回数据
 * `return false` 停止返回数据，不会进入错误数据拦截，也不会进入catch函数中
 * `return Promise.reject('xxxxx')` 返回错误信息, 会错误数据拦截，也会进入catch函数中
 *
 * @param {Object} res 请求返回的数据
 * @param {Object} config 发送请求的配置数据
 * @return {Object|Boolean|Promise<reject>}
 */
globalInterceptor.response.use((res, config) => {
	let header = res.header
	// 更新token
	let token = header.authorization || header.Authorization
	if(token) {
		setAccessToken(token)
	}
	const data = res.data
	if(res.statusCode == 200) {
		// 请求服务器成功
		
		// 登录过期标记
		/* if (data.code == 1019 || data.code == 1018 || data.code == 1020) {
		      let jumpFlag = getJumpLoginFlag()
			  if(!jumpFlag) {
				  // 登录失效，重新登录
				  new Promise(function (resolve, reject) {
					removeUserId()
					removeAccessToken()
					removeUserInfo()
				  })
				  // 设置登录标记，防止重复跳到登录界面
				  setJumpLoginFlag()
			  }
		} */
		return {code:0,data:data,msg: '成功'};
	} else {
		// 提示错误
		uni.showToast({
			icon: "none",
			title: data.err_msg || "出错啦"
		})
		if((data.err_msg || 'error').indexOf('token已失效') != -1) {
			new Promise(function (resolve, reject) {
				removeBaseUser()
				removeUserId()
				removeAccessToken()
			})
			setTimeout(() => {
			  uni.navigateTo({
			      url: '/pages/user/login'
			  });
			}, 800);
		}
		return Promise.resolve({code:-1,msg:'请求服务器失败'});
	}
  },
  (err, config) => {
    uni.showToast({
	  icon: "none",
	  title: "网络请求失败"
    })
    return Promise.resolve({code:-1,msg:'请求服务器失败'});
  }
);
